package py.progweb.sgc.gui.client.dialog;

import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;

import py.progweb.sgc.gui.client.service.VentaService;
import py.progweb.sgc.gui.client.service.VentaServiceAsync;
import py.progweb.sgc.gui.client.widget.TablaProductos;
import py.progweb.sgc.gui.shared.dialogmodel.DataRecord;
import py.progweb.sgc.model.Producto;
import py.progweb.sgc.model.Venta;
import py.progweb.sgc.model.VentaDetalle;
import py.progweb.sgc.model.Cliente;
import py.progweb.sgc.model.Vendedor;

import com.smartgwt.client.data.Record;
import com.smartgwt.client.types.DateDisplayFormat;
import com.smartgwt.client.widgets.IButton;
import com.smartgwt.client.widgets.form.fields.FormItem;
import com.smartgwt.client.widgets.form.fields.SelectItem;
import com.smartgwt.client.widgets.form.fields.DateItem;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.VLayout;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import py.progweb.sgc.gui.shared.dialogmodel.*;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;

public class FormularioVenta extends FormularioCompraVenta{
	
	List<DataRecord> listClientes, listVendedores;
	IButton btnNuevo, btnGuardar;
	SelectItem sltCliente, sltVendedor;
	final DynamicForm form;
	DateItem fecha;
	VentaServiceAsync serviceVenta;
	
	
	public FormularioVenta() {
		super("Ventas");
		
		setWidth(750);
		setHeight(400);
		
		HLayout f = new HLayout();
		f.setPadding(5);
		f.setMembersMargin(10); 
		f.setWidth100();
		f.setHeight100();
		
		serviceVenta = GWT.create(VentaService.class);
		
		form = new DynamicForm();
		form.setWidth(250);
		sltCliente = new SelectItem();
		sltCliente.setRequired(true);
		sltCliente.setTitle("Cliente");
		
		fecha = new DateItem();
		fecha.setTitle("Fecha");
		fecha.setDateFormatter(DateDisplayFormat.TOEUROPEANSHORTDATE);
		fecha.setDefaultValue(new Date());
		
		/*Buscar todos los clientes*/
		final LinkedHashMap<String, String> clientes = new LinkedHashMap<String, String>();
		clientes.put("0", "Elija un cliente...");
		service.getClientesListadoModel(new AsyncCallback<ClientesModel>() {
			
			@Override
			public void onSuccess(ClientesModel result) {
								
				FormularioVenta.this.listClientes = result.getRecords();
				for(DataRecord item: FormularioVenta.this.listClientes){
					clientes.put(item.getPK().toString(), item.getAtributo("nombre").toString());
				}
				FormularioVenta.this.sltCliente.setValueMap(clientes);
			}
			@Override
			public void onFailure(Throwable caught) {
				Window.alert(caught.getMessage());
			}
		});
		
		sltVendedor = new SelectItem();
		sltVendedor.setTitle("Vendedor");
		sltVendedor.setRequired(true);
		
		/*Buscar todos los vendedores*/
		final LinkedHashMap<String, String> vendedores = new LinkedHashMap<String, String>();
		vendedores.put("0", "Elija un vendedor...");
		service.getVendedoresListadoModel(new AsyncCallback<VendedoresModel>() {
			
			@Override
			public void onSuccess(VendedoresModel result) {
								
				FormularioVenta.this.listVendedores = result.getRecords();
				for(DataRecord item: FormularioVenta.this.listVendedores){
					vendedores.put(item.getPK().toString(), item.getAtributo("nombre").toString());
				}
				FormularioVenta.this.sltVendedor.setValueMap(vendedores);
			}
			@Override
			public void onFailure(Throwable caught) {
				Window.alert(caught.getMessage());
			}
		});
		
		btnNuevo = new IButton("Insertar nuevo");  
		btnGuardar = new IButton("Guardar Venta");
        btnNuevo.addClickHandler(new ClickHandler() {  
            public void onClick(ClickEvent event) {  
            	tabla.startEditingNew();  
            }  
        }); 
        
        btnGuardar.addClickHandler(new ClickHandler(){
        	public void onClick(ClickEvent event){
        		//form.validate();
        		if (tabla.hasErrors() || !form.validate()){
        			Window.alert("Aún existen errores en los datos. Cámbielos y vuelva a intentarlo.");
        			return;
        		}
        		if(Window.confirm("¿Desea guardar los cambios realizados?")){
        			Cliente clienteVenta = instanciarCliente(Integer.parseInt(sltCliente.getValue().toString()));
        			Window.alert(sltVendedor.getValue().toString());
        			Vendedor vendedorVenta = instanciarVendedor(Integer.parseInt(sltVendedor.getValue().toString()));
    				//Window.alert(vendedorVenta.getNombre());
    				Venta nuevaVenta = new Venta();
    				nuevaVenta.setCliente(clienteVenta);
    				nuevaVenta.setVendedor(vendedorVenta);
    				nuevaVenta.setFecha((Date)fecha.getValue());
    				List<VentaDetalle> ventaDetalles = new ArrayList<VentaDetalle>();
        			
        			Record[] detalles = tabla.getDataAsRecordList().toArray();
        			//Window.alert(detalles[0].getAttributeAsInt("producto.nombre").toString());
        			for(Record detalle: detalles){
        				VentaDetalle nuevoDetalle = new VentaDetalle();
        				//Window.alert("Algo");
        				nuevoDetalle.setProducto(instanciarProducto(detalle.getAttributeAsInt("producto.nombre")));
        				//Window.alert(nuevoDetalle.getProducto().getNombre());
        				nuevoDetalle.setCantidad(detalle.getAttributeAsInt("cantidad"));
        				nuevoDetalle.setPrecioVenta(detalle.getAttributeAsInt("precioVenta"));
        				nuevoDetalle.setVenta(nuevaVenta);
        				ventaDetalles.add(nuevoDetalle);
        			}
        			nuevaVenta.setVentaDetalles(ventaDetalles);
        			serviceVenta.guardar(nuevaVenta, new AsyncCallback<Void>(){

						@Override
						public void onFailure(Throwable caught) {
							// TODO Auto-generated method stub
							Window.alert(caught.getMessage());
						}

						@Override
						public void onSuccess(Void result) {
							// TODO Auto-generated method stub
							Window.alert("Venta guardada exitosamente");
							FormularioVenta.this.reset();
						}
        			});
        		}
        	}
        });
     /*   
        RequiredIfValidator txtValidator = new RequiredIfValidator();
        txtValidator.setErrorMessage("Este campo es requerido");
        sltCliente.setValidators(txtValidator);
        sltVendedor.setValidators(txtValidator);*/
        
        form.setFields(new FormItem[] {sltCliente, sltVendedor, fecha});
        VLayout lForm= new VLayout();
        lForm.setMembersMargin(10);
        
		lForm.addMember(form);
		lForm.addMember(btnGuardar);
		
		f.addMember(lForm);
		f.addMember(btnNuevo);
		
		this.tabla = new TablaProductos("venta");  
		tabla.setHeight(400);
		f.addMember(this.tabla);
		f.draw();
		this.addItem(f);
	}

	@Override
	public void reset() {
		tabla.clearCriteria();	
		form.clearValues();
	}
	
	public Cliente instanciarCliente(Integer pk){
		Cliente nuevo = new Cliente();
		//Window.alert(pk.toString());
		for(DataRecord cliente: this.listClientes){
			if((Integer)cliente.getPK() == pk){
				nuevo.setCodClientePk(pk);
				nuevo.setNombre((String)cliente.getAtributo("nombre"));
				nuevo.setApellido((String)cliente.getAtributo("apellido"));
				nuevo.setDireccion((String)cliente.getAtributo("direccion"));
				nuevo.setTelefono((String)cliente.getAtributo("telefono"));
				return nuevo;
			}
		}
		return null;
	}
	
	public Vendedor instanciarVendedor(Integer pk){
		Vendedor nuevo = new Vendedor();
		for(DataRecord vendedor: this.listVendedores){
			if((Integer)vendedor.getPK() == pk){
				nuevo.setCodVendedorPk(pk);
				nuevo.setNombre(vendedor.getAtributo("nombre").toString());
				nuevo.setApellido(vendedor.getAtributo("apellido").toString());
				nuevo.setDireccion(vendedor.getAtributo("direccion").toString());
				nuevo.setTelefono(vendedor.getAtributo("telefono").toString());
				return nuevo;
			}
		}
		return null;
	}
	
	public Producto instanciarProducto(Integer pk){
		Producto nuevo = new Producto();
		//Window.alert(this.tabla.listProductos.get(0).toString());
		for(DataRecord producto: this.tabla.listProductos){
			//Window.alert("Producto: " + producto.getPK() + ", " + pk);
			if(pk.toString().equals(producto.getPK().toString())){
				//Window.alert(producto.getPK().toString());
				nuevo.setCodProductoPk(pk);
				nuevo.setNombre(producto.getAtributo("nombre").toString());
				nuevo.setPrecio_actual(Integer.parseInt(producto.getAtributo("precio_actual").toString()));
				nuevo.setStock(Integer.parseInt(producto.getAtributo("stock").toString()));
				nuevo.setGanancia(Integer.parseInt(producto.getAtributo("ganancia").toString()));
				return nuevo;
			}
		}
		return null;
	}
	
}


